import app from './modules/app.js'
import error from './modules/error.js'
import user from './modules/user.js'

// const modulesFiles = require.context('./modules', true, /\.js$/)
// const modules = modulesFiles.keys().reduce((modules, modulePath) => {
//     const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
//     const value = modulesFiles(modulePath)
//     modules[moduleName] = value.default
//     return modules
// }, {})

// #ifndef VUE3
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
// #endif

// #ifdef VUE3
import {
	createStore
} from 'vuex'
// todo ssr
// #endif

// #ifndef VUE3
var store = new Vuex.Store({
	modules: {
		app,
		error,
		user
	},
	mutations: {
		// vk-unicloud 框架需要的 updateStore mutation
		// 用于动态更新 store 中的值，支持路径字符串如 '$user.userInfo.avatar'
		updateStore(state, { name, value }) {
			if (!name) return
			// 处理路径字符串，如 '$user.userInfo.avatar'
			// '$' 开头的表示模块名，需要去掉 '$' 前缀
			const keys = name.replace(/^\$/, '').split('.')
			if (keys.length === 0) return
			
			// 获取模块名（第一个键）
			const moduleName = keys[0]
			// 如果模块存在，则更新模块的 state
			if (state[moduleName] && keys.length > 1) {
				let target = state[moduleName]
				// 遍历中间路径
				for (let i = 1; i < keys.length - 1; i++) {
					const key = keys[i]
					if (!target[key] || typeof target[key] !== 'object') {
						target[key] = {}
					}
					target = target[key]
				}
				// 设置最后一个键的值
				const lastKey = keys[keys.length - 1]
				target[lastKey] = value
			} else if (keys.length === 1) {
				// 如果只有一个键，直接设置模块的根 state（不推荐，但兼容）
				if (!state[moduleName]) {
					state[moduleName] = {}
				}
				// 注意：这里不能直接赋值，因为模块的 state 是响应式的
				// 如果需要设置整个模块的值，应该通过模块的 mutation
			}
		}
	}
})
// #endif

// #ifdef VUE3
var store = createStore({
	modules: {
		app,
		error,
		user
	},
	mutations: {
		// vk-unicloud 框架需要的 updateStore mutation
		// 用于动态更新 store 中的值，支持路径字符串如 '$user.userInfo.avatar'
		updateStore(state, { name, value }) {
			if (!name) return
			// 处理路径字符串，如 '$user.userInfo.avatar'
			// '$' 开头的表示模块名，需要去掉 '$' 前缀
			const keys = name.replace(/^\$/, '').split('.')
			if (keys.length === 0) return
			
			// 获取模块名（第一个键）
			const moduleName = keys[0]
			// 如果模块存在，则更新模块的 state
			if (state[moduleName] && keys.length > 1) {
				let target = state[moduleName]
				// 遍历中间路径
				for (let i = 1; i < keys.length - 1; i++) {
					const key = keys[i]
					if (!target[key] || typeof target[key] !== 'object') {
						target[key] = {}
					}
					target = target[key]
				}
				// 设置最后一个键的值
				const lastKey = keys[keys.length - 1]
				target[lastKey] = value
			} else if (keys.length === 1) {
				// 如果只有一个键，直接设置模块的根 state（不推荐，但兼容）
				if (!state[moduleName]) {
					state[moduleName] = {}
				}
				// 注意：这里不能直接赋值，因为模块的 state 是响应式的
				// 如果需要设置整个模块的值，应该通过模块的 mutation
			}
		}
	}
})
// #endif


export default store
